package org.example06.ba03;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Date;


/**
 * @Aspect：是aspectJ中的注解。
 *      作用：表示当前类是切面类。
 *      切面类：是用来给业务方法增肌功能的类。在这个类中有切面的功能代码。
 *      位置：在类定义的上面
 */
@Aspect
public class MyAspect {
    /**
     * 环绕溶质方法的定义格式
     * 1。 public
     * 2. 必须有一个返回值，推荐Object
     * 3. 方法名自定义
     * 4. 方法有参数，固定的惨ProceedingJoinPoint
     */
    /**
     * @Around 环绕通知
     *      属性：value切入点表达式
     *      位置：在方法的定义上放
     *      特点：
     *          1.它是功能最强的通知
     *          2.在目标方法的前后都能增强功能
     *          3.控制目标方法是否被调用执行
     *          4.修改原来的目标方法的执行结果，影响最后的调用结果
     *
     *      环绕通知，等同于jdk动态代理的InvocationHandler接口
     *
     *      参数：ProceedingJoinPoint就等同于Method
     *          作用:执行目标方法的
     *      返回值：就是目标方法的执行结果，可以被修改。
     *
     *      环绕通知：经常用于做事务。在目标方法前开启事务，在目标方法后提交事务。
     *
     * @return
     */

    @Around(value = "execution(* *..SomeServiceImpl.doFirst(..))")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {

            String name="";
            Object args [] = pjp.getArgs();
            if(args != null &&  args.length > 1){
                Object arg = args[0];
                name = (String) arg;
            }


        Object result = null;
        System.out.println("环绕通知：前+"+new Date());
        //1.目标方法调用
        if("zs".equals(name)){
            //符合条件
        } else {
            //不符合条件
        }
        result = pjp.proceed();//method.invoke();
        System.out.println("环绕通知：后+"+new Date());


        //2 在目标方法的前或后加功能

        //修改目标方法结果
        if(result == null) {
            result  = "he";
        }
        //返回目标方法的执行结果
        return result;
    }
}
